/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.jjsoft.disco.gco.util;

import com.jjsoft.disco.gco.mdl.Factura;
import com.jjsoft.disco.gco.mdl.Producto;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.AttributeSet;
import javax.print.attribute.HashAttributeSet;
import javax.swing.JOptionPane;

/**
 *
 * @author Johnny
 */
public class CImprimir {
    /*public void imprimirFactura(Factura fact, List<Articulo> listaArticulos, String impresora)
     {
     DocFlavor docFormat = DocFlavor.SERVICE_FORMATTED.PRINTABLE;

     Doc document = new SimpleDoc(new printObject(fact, listaArticulos), docFormat, null);

     String printerName = impresora;

     PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
     int impr = 0;
     boolean existe = false;
     for (int i = 0; i < services.length; i++) {
     if (services[i].getName().equals(impresora)) {
     impr = i;
     existe = true;
     }
     }
     if (existe) {
     DocPrintJob printJob = services[impr].createPrintJob();
     try
     {
     printJob.print(document, null);
     System.out.print("imprimiendo en " + services[impr]);
     } catch (PrintException ex) {
     Logger.getLogger(CImprimir.class.getName()).log(Level.SEVERE, null, ex);
     ex.printStackTrace();
     }
     }
     else {
     JOptionPane.showMessageDialog(null, "No esta instalada la impresora seleccionada para la impresion. \n Por favor revise la impresora en las configuraciones");
     }
     }

     public void limpiarImpresora() { DocFlavor docFormat = DocFlavor.SERVICE_FORMATTED.PRINTABLE;

     Doc document = new SimpleDoc(new ObjetoDeImpresion(), docFormat, null);

     String printerName = configuraciones.impresoraProfomas;

     PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
     int impr = 0;
     boolean existe = false;
     for (int i = 0; i < services.length; i++) {
     if (services[i].getName().equals(printerName)) {
     impr = i;
     existe = true;
     }
     }
     if (existe) {
     DocPrintJob printJob = services[impr].createPrintJob();
     try
     {
     printJob.print(document, null);
     JOptionPane.showMessageDialog(null, "Completado");
     } catch (PrintException ex) {
     Logger.getLogger(CImprimir.class.getName()).log(Level.SEVERE, null, ex);
     ex.printStackTrace();
     }
     }
     else {
     JOptionPane.showMessageDialog(null, "No esta instalada la impresora seleccionada para la impresion. \n Por favor revise la impresora en las configuraciones");
     }
     }*/

    public void imprimirDetalleFactura(Factura factura, String impresora, int personas,int hombres, int mujeres) {
        DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
        PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
        int impr = 0;
        boolean existe = true;
        for (int i = 0; i < services.length; i++) {
            if (services[i].getName().equals(impresora)) {
                impr = i;
                existe = true;
            }
        }
        if (existe) {
            String ss = "========== DETALLE DE CONSUMO ==========";
            String num = AgregaEspacios("Numero: " + String.valueOf(factura.getNumero()));
            ss = ss + num;
            String local = AgregaEspacios(configuraciones.NombreLocal);
            ss = ss + local;
            String propietario = AgregaEspacios(configuraciones.NombrePropietario);
            ss = ss + propietario;
            String ruc = AgregaEspacios("RUC:" + configuraciones.ruc);
            ss = ss + ruc;
            String direccion = completaLineas("Direccion:" + configuraciones.Direccion);
            ss = ss + direccion;
            String telefono = AgregaEspacios("Telefono:" + configuraciones.Telefono);
            ss = ss + telefono;
            String fecha = AgregaEspacios("Fecha:" + factura.getFecha().toLocaleString());
            ss = ss + fecha;
            String cliente = completaLineas("Cliente:" + factura.getCedulaCliente().getNombres() + " " + factura.getCedulaCliente().getApellidos());
            ss = ss + cliente;
            String ci = AgregaEspacios("CI/RUC:" + factura.getCedulaCliente().getCedula());
            ss = ss + ci;
            ss = ss + "----------------------------------------";
            ss = ss + "CANT  DESC                       V.VENTA";
            ss = ss + obtenDetalle(factura,hombres,mujeres);
            ss = ss + "----------------------------------------";
            ss = ss + "               **SALEN**                ";
            ss = ss + AgregaEspacios("Hombres:"+"       "+hombres);
            ss = ss + AgregaEspacios("Mujeres:"+"       "+mujeres);
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                       .\f";
            System.out.println(ss);
            byte[] bytes = ss.getBytes();
            DocPrintJob printJob = services[impr].createPrintJob();
            Doc doc = new SimpleDoc(bytes, flavor, null);
            try {
                printJob.print(doc, null);
                System.out.print("imprimiendo en " + services[impr]);
            } catch (PrintException ex) {
                Logger.getLogger(CImprimir.class.getName()).log(Level.SEVERE, null, ex);
                ex.printStackTrace();
            }
        } else {
            JOptionPane.showMessageDialog(null, "No esta instalada la impresora seleccionada para la impresion. \n Por favor revise la impresora en las configuraciones");
        }
    }

    public void imprimirConsumo(Factura factura, String impresora, int personas,int hombres, int mujeres) {
        DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
        PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
        int impr = 0;
        boolean existe = true;
        for (int i = 0; i < services.length; i++) {
            if (services[i].getName().equals(impresora)) {
                impr = i;
                existe = true;
            }
        }
        if (existe) {
            String ss = "=========== TICKET DE SALIDA ===========";
            String num = AgregaEspacios("Numero: " + String.valueOf(factura.getNumero()));
            ss = ss + num;
            String local = AgregaEspacios(configuraciones.NombreLocal);
            ss = ss + local;
            String propietario = AgregaEspacios(configuraciones.NombrePropietario);
            ss = ss + propietario;
            String ruc = AgregaEspacios("RUC:" + configuraciones.ruc);
            ss = ss + ruc;
            String direccion = completaLineas("Direccion:" + configuraciones.Direccion);
            ss = ss + direccion;
            String telefono = AgregaEspacios("Telefono:" + configuraciones.Telefono);
            ss = ss + telefono;
            String fecha = AgregaEspacios("Fecha:" + factura.getFecha().toLocaleString());
            ss = ss + fecha;
            String cliente = completaLineas("Cliente:" + factura.getCedulaCliente().getNombres() + " " + factura.getCedulaCliente().getApellidos());
            ss = ss + cliente;
            String ci = AgregaEspacios("CI/RUC:" + factura.getCedulaCliente().getCedula());
            ss = ss + ci;
            ss = ss + "----------------------------------------";
            ss = ss + AgregaEspacios("Total consumo: " + String.valueOf(CNumeros.redondear(factura.getTotal())));
            ss = ss + "----------------------------------------";
            ss = ss + "               **SALEN**                ";
            ss = ss + AgregaEspacios("Hombres:"+"       "+hombres);
            ss = ss + AgregaEspacios("Mujeres:"+"       "+mujeres);
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                       .\f";
            System.out.println(ss);
            byte[] bytes = ss.getBytes();
            DocPrintJob printJob = services[impr].createPrintJob();
            Doc doc = new SimpleDoc(bytes, flavor, null);
            try {
                printJob.print(doc, null);
                System.out.print("imprimiendo en " + services[impr]);
            } catch (PrintException ex) {
                Logger.getLogger(CImprimir.class.getName()).log(Level.SEVERE, null, ex);
                ex.printStackTrace();
            }
        } else {
            JOptionPane.showMessageDialog(null, "No esta instalada la impresora seleccionada para la impresion. \n Por favor revise la impresora en las configuraciones");
        }
    }

    public String AgregaEspacios(String cadena) {
        for (int i = cadena.length(); i < 40; i++) {
            cadena = cadena + " ";
        }
        if (cadena.length() > 40) {
            cadena = cadena.substring(0, 39);
        }
        return cadena;
    }

    public String AgregaEspaciosDelante(String cadena) {
        for (int i = cadena.length(); i < 40; i++) {
            cadena = " " + cadena;
        }
        if (cadena.length() > 40) {
            cadena = cadena.substring(0, 40);
        }
        return cadena;
    }

    public String AgregaNEspacios(String cadena, int espacios) {
        for (int i = 0; i < espacios; i++) {
            cadena = cadena + " ";
        }
        return cadena;
    }

    public String obtenDetalle(Factura factura, int hombres, int mujeres) {
        String detalle = "";
        if (factura.getDetallefacturaList()!=null && factura.getDetallefacturaList().size()>0)
        {
            for (int i = 0; i < factura.getDetallefacturaList().size(); i++) {
            String articulo = "";
            String cant = String.valueOf(factura.getDetallefacturaList().get(i).getCantidad().toString());
            cant = AgregaNEspacios(cant, 6 - cant.length());
            articulo = articulo + cant;
            String desc = factura.getDetallefacturaList().get(i).getIdArticulo().getDescripcion();
            if (desc.length() < 25) {
                desc = AgregaNEspacios(desc, 27 - desc.length());
            } else {
                desc = desc.substring(0, 26);
                desc = AgregaNEspacios(desc, 27 - desc.length());
            }
            articulo = articulo + desc;
            String valor = String.valueOf(CNumeros.redondear(factura.getDetallefacturaList().get(i).getCantidad() * factura.getDetallefacturaList().get(i).getPrecioVenta()));
            valor = AgregaNEspacios(valor, 7 - valor.length());
            articulo = articulo + valor;

            detalle = detalle + articulo;
        }
        }
        String articulo = "";
        
        if (hombres > 0) {
            String cant = String.valueOf(hombres);
            cant = AgregaNEspacios(cant, 6 - cant.length());
            articulo = articulo + cant;
            String desc = "Cover Hombres";
            desc = AgregaNEspacios(desc, 27 - desc.length());
            articulo = articulo + desc;
            double cover=CNumeros.redondear((configuraciones.coverh/(1+(configuraciones.iva/100D)))*hombres);
            String valor = String.valueOf(cover);
            valor = AgregaNEspacios(valor, 7 - valor.length());
            articulo = articulo + valor;
            detalle = detalle + articulo;
        }
        if (mujeres > 0) {
            String cant = String.valueOf(mujeres);
            cant = AgregaNEspacios(cant, 6 - cant.length());
            articulo = articulo + cant;
            String desc = "Cover Mujeres";
            desc = AgregaNEspacios(desc, 27 - desc.length());
            articulo = articulo + desc;
            double cover=CNumeros.redondear((configuraciones.coverm/(1+(configuraciones.iva/100D)))*hombres);
            String valor = String.valueOf(cover);
            valor = AgregaNEspacios(valor, 7 - valor.length());
            articulo = articulo + valor;
            detalle = detalle + articulo;
        }
        detalle = detalle + "----------------------------------------";
        double subt = (factura.getDescuento().doubleValue() / 100.0D + 1.0D) * factura.getTotal().doubleValue() - factura.getIva().doubleValue();
        double descuento = subt * factura.getDescuento().doubleValue();
        String subtotal = AgregaEspaciosDelante("Subtotal: " + CNumeros.redondear(subt));
        detalle = detalle + subtotal;
        String desc = AgregaEspaciosDelante("Descuento: " + CNumeros.redondear(descuento));
        detalle = detalle + desc;
        String cons = AgregaEspaciosDelante("Consumible: " + CNumeros.redondear(factura.getConsumible()));
        detalle = detalle + cons;
        String iva = AgregaEspaciosDelante("IVA: " + CNumeros.redondear(factura.getIva().doubleValue()));
        detalle = detalle + iva;
        String total = AgregaEspaciosDelante("Total: " + CNumeros.redondear(factura.getTotal().doubleValue()));
        detalle = detalle + total;
        return detalle;
    }
    /*
     public void imprimirServicioTecnico(ServicioTecnico serv, int numero, String impresora)
     {
     DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
     PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
     int impr = 0;
     boolean existe = false;
     for (int i = 0; i < services.length; i++) {
     if (services[i].getName().equals(impresora)) {
     impr = i;
     existe = true;
     }
     }
     if (existe) {
     String ss = "===== SOLICITUD DE SERVICIO TECNICO ====";
     String num = AgregaEspacios("Numero: " + String.valueOf(numero));
     ss = ss + num;
     String local = AgregaEspacios(configuraciones.NombreLocal);
     ss = ss + local;
     String propietario = AgregaEspacios(configuraciones.NombrePropietario);
     ss = ss + propietario;
     String ruc = AgregaEspacios("RUC:" + configuraciones.ruc);
     ss = ss + ruc;
     String direccion = completaLineas("Direccion:" + configuraciones.Direccion);
     ss = ss + direccion;
     String telefono = AgregaEspacios("Telefono:" + configuraciones.Telefono);
     ss = ss + telefono;
     String fecha = AgregaEspacios("Fecha:" + serv.getFecha().getDate() + "/" + (serv.getFecha().getMonth() + 1) + "/" + (serv.getFecha().getYear() + 1900));
     ss = ss + fecha;
     String cliente = completaLineas("Cliente:" + serv.getCedulaCliente().getNombres() + " " + serv.getCedulaCliente().getApellidos());
     ss = ss + cliente;
     String ci = AgregaEspacios("CI/RUC:" + serv.getCedulaCliente().getCedula());
     ss = ss + ci;
     ss = ss + "----------------------------------------";
     String datos = completaLineas("Datos del equipo: " + serv.getDatos().trim());
     ss = ss + datos;
     String numSer = AgregaEspacios("Numero/Serie: " + serv.getNumeroSerie().trim());
     ss = ss + numSer;
     String chip = AgregaEspacios("Chip: " + serv.getChip().trim());
     ss = ss + chip;
     String memoria = AgregaEspacios("Memoria: " + serv.getMemoria().trim());
     ss = ss + memoria;
     String fallo = completaLineas("Fallo Reportado: " + serv.getFallo().trim());
     ss = ss + fallo;
     String obser = completaLineas("Observaciones: " + serv.getObservaciones().trim());
     ss = ss + obser;
     ss = ss + "----------------------------------------";
     String mensaje = "";
     mensaje = mensaje + AgregaEspacios("LEA ESTO ES IMPORTANTE: ");
     mensaje = mensaje + completaLineas("*El costo de revision del equipo es de 4 dolares americanos");
     mensaje = mensaje + completaLineas("*Me comprometo a cancelar hasta un valor de 25 dolares por la reparacion de mi equipo sin previa notificacion");
     mensaje = mensaje + completaLineas(new StringBuilder().append("*Si el equipo no es retirado en 30 dias a partir de la fecha de ingreso, seran considerados en abandono y ").append(configuraciones.NombreLocal.toUpperCase()).append(" procedera al remate del equipo para cubrir gastos de operacion").toString());
     mensaje = mensaje + completaLineas("*La garantia de reparacion sobre el fallo es de 30 dias; los equipos mojados, reinstalados el sistema operativo, flasheados, con virus informatico, o software, no aplica garantia");
     ss = ss + mensaje;
     ss = ss + "                                        ";
     ss = ss + "                                        ";
     ss = ss + "                                        ";
     ss = ss + "                                        ";
     ss = ss + "Firma_________________________________  ";
     ss = ss + AgregaEspacios(new StringBuilder().append("Fecha: ").append(serv.getFecha().getDate()).append("/").append(serv.getFecha().getMonth() + 1).append("/").append(serv.getFecha().getYear() + 1900).toString());
     ss = ss + "                                        ";
     ss = ss + "                                        ";
     ss = ss + "                                        ";
     ss = ss + "                                        ";
     ss = ss + "                                        ";
     ss = ss + "                                        ";
     ss = ss + "                                        ";
     ss = ss + "                                       .\f";
     ss = ss.trim();
     byte[] bytes = ss.getBytes();
     DocPrintJob printJob = services[impr].createPrintJob();
     Doc doc = new SimpleDoc(bytes, flavor, null);
     try
     {
     printJob.print(doc, null);
     System.out.print("imprimiendo en " + services[impr]);
     } catch (PrintException ex) {
     Logger.getLogger(CImprimir.class.getName()).log(Level.SEVERE, null, ex);
     ex.printStackTrace();
     }
     }
     else {
     JOptionPane.showMessageDialog(null, "No esta instalada la impresora seleccionada para la impresion. \n Por favor revise la impresora en las configuraciones");
     }
     }
     */

    public String completaLineas(String cadena) {
        int espacios = cadena.length() % 40;
        if (espacios > 0) {
            espacios = 40 - espacios;
            for (int i = 0; i < espacios; i++) {
                cadena = cadena + " ";
            }
        }
        return cadena;
    }

    public List<String> getImpresoras() {
        List impresoras = new ArrayList();
        DocFlavor docFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;
        AttributeSet attributeSet = new HashAttributeSet();
        PrintService[] services = PrintServiceLookup.lookupPrintServices(docFormat, attributeSet);
        int impr = 0;
        for (int i = 0; i < services.length; i++) {
            impresoras.add(services[i].getName());
        }

        return impresoras;
    }
    
    public void imprimirStock(List<Producto> listaProductos) {
        DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
        PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
        int impr = 0;
        boolean existe = true;
        for (int i = 0; i < services.length; i++) {
            if (services[i].getName().equals(configuraciones.impresoraFacturas)) {
                impr = i;
                existe = true;
            }
        }
        if (existe) {
            String ss = "=========== REPORTE DE STOCK ===========";
            for(Producto producto:listaProductos)
            {
                ss=ss+completaLineas(producto.getCodigo()+" "+producto.getDescripcion()+" "+producto.getStock());
            }
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                        ";
            ss = ss + "                                       .\f";
            System.out.println(ss);
            byte[] bytes = ss.getBytes();
            DocPrintJob printJob = services[impr].createPrintJob();
            Doc doc = new SimpleDoc(bytes, flavor, null);
            try {
                printJob.print(doc, null);
                System.out.print("imprimiendo en " + services[impr]);
            } catch (PrintException ex) {
                Logger.getLogger(CImprimir.class.getName()).log(Level.SEVERE, null, ex);
                ex.printStackTrace();
            }
        } else {
            JOptionPane.showMessageDialog(null, "No esta instalada la impresora seleccionada para la impresion. \n Por favor revise la impresora en las configuraciones");
        }
    }
}